/**
 * @file OrbitDef.h 定义弧段数据类型
 */

#pragma once

#include <vector>
#include <cstdio>
#include <boost/shared_ptr.hpp>

struct OrbitNode {
    char bjtstr[40]; //< 北京时间
    int tmSat;  //< 星上时间
    double azi, alt; //< 水平系坐标
    double ra, dec;  //< 赤道坐标, J2000
};
typedef std::vector<OrbitNode> OrbNodeVec;

struct Orbit {
    bool repeated = false; // 重复标记
    int code; //< 目标编号
    int date; //< 北京时日期
    int time; //< 起始点北京时间
    OrbNodeVec nodes; //< 星历点

public:
    size_t Size() const {return nodes.size();}

    //< 输出星历到文件
    void Output(FILE* fp) {
        size_t n = nodes.size();
        if (n < 10) return ;

        int duration = nodes[n - 1].tmSat - nodes[0].tmSat + 1;
        double vdur = duration / 60.0;

        for (auto &it : nodes) {
            fprintf (fp, "%9d %s %8d %10.2lf %12.4lf %12.4lf %12.4lf %12.4lf\n",
                code, it.bjtstr,
                it.tmSat,
                vdur,
                it.ra, it.dec,
                it.azi, it.alt);
        }
    }
};
typedef boost::shared_ptr<Orbit> OrbitPtr;
typedef std::vector<OrbitPtr> OrbPtrVec;
